package com.symaster.gameengine.core;

import com.symaster.common.geom.entity.Polygon;
import com.symaster.gameengine.e2d.transform.Transform;

/**
 * 碰撞体顶级父类
 *
 * @author yinmiao
 * @version 2023/11/15
 */
public abstract class Collider extends Component {

    /**
     * 子节点是否需要判断碰撞
     */
    private boolean childNodeCollision;

    /**
     * 测试指定的碰撞器与this是否碰撞
     * <p>如果test参数传入this则返回true</p>
     * <p>只要test与this其中一个没有 {@link Transform} 组件则返回false</p>
     * <p>如果开启了子节点碰撞{@link #childNodeCollision}, 当某个子节点没有{@link Transform}组件会忽略相应子节点</p>
     *
     * @param test 测试目标
     * @return true
     */
    public final boolean collision(Collider test) {
        if (this == test) {
            return true;
        }

        if (getComponent(Transform.class) == null || test.getComponent(Transform.class) == null) {
            return false;
        }

        return isCollision(test);
    }

    /**
     * 子类实现判断是否碰撞
     *
     * @param test 测试目标
     * @return 是否碰撞
     */
    protected abstract boolean isCollision(Collider test);

    protected abstract Polygon toPolygon();

    public boolean isChildNodeCollision() {
        return childNodeCollision;
    }

    public void setChildNodeCollision(boolean childNodeCollision) {
        this.childNodeCollision = childNodeCollision;
    }
}
